from rest_framework.views import APIView
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response
from datetime import *
from apps.users.models import User
from apps.goods.models import GoodsVisitCount


class UserTotalCountView(APIView):
    # 权限指定 管理员有权限访问
    permission_classes = [IsAdminUser]

    def get(self, request):
        """
            用户总数统计
        :param request:
        :return:
        """
        # 获取当天日期
        now_day = date.today()
        # 获取用户总数
        # count = User.objects.all().count()
        # 返回所有普通用户的数量
        count = User.objects.filter(is_staff=False).count()
        # 结果返回

        return Response({
            'date': now_day,
            'count': count
        })


class UserDayIncrementView(APIView):
    # 权限指定 管理员有权限访问
    permission_classes = [IsAdminUser]

    def get(self, request):
        """
            日增用户统计
        :param request:
        :return:
        """
        # 获取当天日期
        now_day = date.today()
        # 返回所有普通用户的数量 多条件查询 注册时间大于等于当天日期是今天注册的用户  date_joined注册时间字段
        count = User.objects.filter(date_joined__gte=now_day, is_staff=False).count()
        # 结果返回

        return Response({
            'date': now_day,
            'count': count
        })


class UserDayActiveView(APIView):
    # 权限指定 管理员有权限访问
    permission_classes = [IsAdminUser]

    def get(self, request):
        """
            日活用户统计  当天登录的多少用户
        :param request:
        :return:
        """
        # 获取当天日期
        now_day = date.today()
        # 返回所有普通用户的数量 多条件查询 登录时间大于等于当天日期是今天登录的用户  last_login注册时间字段
        count = User.objects.filter(last_login__gte=now_day, is_staff=False).count()
        # 结果返回

        return Response({
            'date': now_day,
            'count': count
        })


class UserDayOrdersView(APIView):
    # 权限指定 管理员有权限访问
    permission_classes = [IsAdminUser]

    def get(self, request):
        """
            日下单用户统计  当天下单的有多少用户
        :param request:
        :return:
        """
        # 获取当天日期
        now_day = date.today()
        # 返回所有普通用户的数量 关联过滤查询 以订单表的数据作为查询条件查询用户表
        users = User.objects.filter(orderinfo__create_time__gte=now_day, is_staff=False)
        # 去重
        data = set(users)
        # 统计数量
        count = len(data)
        # 结果返回
        return Response({
            'date': now_day,
            'count': count
        })


class UserMonthIncrement(APIView):
    # 权限指定 管理员有权限访问
    permission_classes = [IsAdminUser]

    def get(self, request):
        """
            月增用户统计  一个月范围内每天的注册用户数量
        :param request:
        :return:
        """
        # 获取当天日期
        now_day = date.today()
        # 获取30天之前日期 当天日期减去30天  timedelta减天数
        old_day = now_day - timedelta(30)
        # 从30天前开始遍历，进行查询每天的用户注册数量
        data_list = []
        for i in range(0, 30):
            # 获取当天日期
            index_day = old_day + timedelta(i)
            # 获取下一天日期
            next_day = old_day + timedelta(i + 1)
            # 查询用户 大于等于当天小于下一天就是今天
            count = User.objects.filter(date_joined__gte=index_day, date_joined__lt=next_day).count()
            # 将数据写入列表
            data_list.append({
                'count': count,
                'date': index_day
            })

        return Response(data_list)


class GoodsDayViews(APIView):
    # 权限指定 管理员有权限访问
    permission_classes = [IsAdminUser]

    def get(self, request):
        # 获取当天日期
        now_day = date.today()
        # 查询商品访问量数据
        datas = GoodsVisitCount.objects.filter(date=now_day)

        data_list = []
        for data in datas:
            data_list.append(
                {
                    "category": data.category.name,
                    "count": data.count
                }
            )

        return Response(data_list)
